"""
不可变数据：Number（数字）、String（字符串）、Tuple（元组）。
可变数据：List（列表）、Dictionary（字典）、Set（集合）。
用Python内置的type（）函数查看数据的类型，也可以用isinstance来判断数据是不是指定的类型，返回True和False。
数字的操作运算：+、 -、 *、 / 、 **（幂运算）、 %（取余）、
//（地板除，相除后只保留整数部分，即向下取整，但是如果其中一个操作数为负数，则取负无穷大方向距离结果最近的整数）
"""

import pandas as pd
import numpy as np


##字符串
var = 'hello world'
var[0]
var[-1]
var[-3:-1]
var[::-1] #反转字符串
var[1:7:2] #取一到七，步长为2

st_r = 'goo_d'
len(st_r) #4（字符长度)
st_r.replace('g' , 'G')  # replace替换字符
st_r.split('-') #goo , d
'好山好水好风光'.split('hao') #'' , 山，水，风光
s = '——By_'.join(['山' ,'shui' ,'fengguang']) #字符串链接

st_r.upper() #全转大写
s2= s.lower() #全转小写
s2.swapcase() #大小写互换
s2.capitalize() #首字母转大写
s2.islower() #True ,Fales 是否全为小写
s2.isupper() # 是否全是大写
s2.zfill(6) #指定长度，长度不够，前面补0


#列表
list_one = [1,2,3,4,5,6,3]
len(list_one)
max(list_one)
min(list_one)
sum(list_one)

print(list_one.index(4)) #3  index() 函数用于从列表中找出某个值第一个匹配项的索引位置。
list_one.count(1)

print(sorted(list_one)) #返回一个排序的列表，但是不影响原来的列表
any(list_one)  #True 至少有一个元素为真
all(list_one) # True 是否所有元素为真
list_one.append(4) #添加一个元素
list_one.pop()  #每执行一次，删除最后一个元素
list_one.extend([7,8,9]) # 与其他列表合并
list_one.insert(1, 'two') #指定元素插入到指定索引位置
list_one.remove(3) #删除第一次出现的数据
list_one.clear()

#列表推导式
[i for i in range(10)] #将一个可迭代对象展开，生成一个列表
['第'+str(i) for i in range(10)] #['第0' ，'第1' ，…… ]
[i for i in range(10) if i%2 == 0]  #[0,2,4] 条件筛选，取偶
[i.upper() for i in 'world  hello'  if i != ' ' ] # 拆开字符，过滤空格，全部变为大写



##元组  字典
"""
元组的索引机制和列表一样。
需要掌握元组的解包操作。
"""
tuple1 = (1,2,3,4,5,6)
a , *b , c =  tuple1 #a占第一个，c占最后一个，剩下的组成列表赋值给b
print(b)


##字典
d = {} # 定义空字典
d = dict() # 定义空字典

d = {'a': 1, 'b': 2, 'c': 3}
d = {'a': 1, 'a': 1, 'a': 1} # {'a': 1} key不能重复， 重复时取最后一个
d = {'a': 1, 'b': {'x':3}} # 嵌套词典
d = {'a': [1, 2, 3], 'b': [4, 5, 6]} # 嵌套列表

# 以下均可定义如下结果
# {'name': 'Tom', 'age': 18, 'height': 180}
d = dict(name='Tom', age=18, height=180)
d = dict([('name', 'Tom'), ('age', 18), ('height', 180)])
d = dict(zip(['name', 'age', 'height'], ['Tom', 18, 180]))
print(d)
d['name']  # 'Tom' （获取键的值）
d['age'] = 20 # 将age的值更新为20
d['Female'] = 'man' # 增加属性
d.get('height', 180) # 180

# d.pop('name') # 'Tom' （删除指定key）
d.popitem() # 随机删除某一项
del d['name'] # 删除键值对
# d.clear # 清空字典

# 按类型访问，可迭代
d.keys() # 列出所有键
d.values() # 列出所有制
d.items() # 列出所有键值对元组（k， v）

# 操作
d.setdefault('a', 3) # 插入一个键并给定默认值3，如果不指定，则为None
# d1.update(dict2) # 将字典dict2的键值对添加到字典dict
# 如果键存在，则返回其对应值；如果键不在字典中，则返回默认值
d.get('math', 100) # 100
d2 = d.copy() # 深拷贝，d变化不影响d2

d = {'a': 1, 'b': 2, 'c': 3}
max(d) # 'c' （最大的键）
min(d) # 'a' （最小的键）
len(d) # 3 （字典的长度）
str(d) # "{'a': 1, 'b': 2, 'c': 3}" （字符串形式）
any(d) # True （只要一个键为True）
all(d) # True （所有键都为True）
sorted(d) # ['a', 'b', 'c'] # （所有键的列表排序）


# 嵌套取值
d = {'a': {'name': 'Tom', 'age':18}, 'b':[4, 5, 6]}
d['b'][1] # 5
d['a']['age'] # 18

#集合
s = {} # 空集合
s = {'5元', '10元', '20元'} # 定义集合
s = set() # 空集合
s = set([1, 2, 3, 4, 5]) # {1, 2, 3, 4, 5} （使用列表定义）
s = {1, True, 'a'}
s = {1, 1, 1} # s = {1} （去重）
type(s) # set （类型检测）

s  = {'a', 'b', 'c'}

# 判断是否有某个元素
'a' in s # True

# 添加元素
s.add(2) # {2, 'a', 'b', 'c'}
s.update([1, 3, 4]) # {1, 2, 3, 4, 'a', 'b', 'c'}

# 删除和清空元素
s.remove('a') #{'b', 'c'}
s.discard('3') # 删除一个元素，无则忽略，不会报错
s.clear() # set() （清空）



#numpy 函数构建数据
np.arange(10) # 10个，不包括10，步长为1
np.arange(3, 10, 0.1) # 3-9，步长为0.1

np.linspace(2.0, 3.0, num=5, endpoint=False) # 2.0-3.0，生成均匀的5个值，不包括3.0

np.random.randn(6, 4) # 返回一个6*4的随机数组， 浮点型
np.random.randint(3, 7, size=(2, 4)) # 指定范围、指定形状的数组，整型

# 创建值为0的数组
np.zeros(6) # 6个浮点0.
np.zeros((5, 6), dtype=int) # 5*6整型0

np.ones(4)
np.empty(4)

# 创建一份和目标结构相同的0值数组
np.zeros_like(np.arange(6))
np.ones_like(np.arange(6))
np.empty_like(np.arange(6))
np.emty_like(np.range(10))

